/*
 * TreeTemplate.h
 *
 *  Created on: 2011/08/07
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_SCENE_TREETEMPLATE_H
#define INCLUDED_NTENGINE_SCENE_TREETEMPLATE_H

#include "NTEngine/Xml/Element.h"
#include "NTEngine/Xml/Attribute.h"

#include "Scene/src/BatchImpl.h"
#include "Scene/src/NodeTemplate.h"
#include "Scene/src/Node.h"

namespace NTEngine {
namespace Math {
	class Vector3;
} // namespace Math
using namespace Math;

namespace Xml {
	class Element;
} // namespace Xml

namespace Scene {

//ツリーの原型。ライブラリの外からは見えないのでいつものImplはない。
class TreeTemplate {
public:
	TreeTemplate( Xml::ConstElement&, Container::Impl& ); //これはcpp内。
	~TreeTemplate(){
		SAFE_DELETE_ARRAY( mNodes );
		mName = 0; //コンテナが持っている文字列なのでここでは参照をはずすだけ
		mContainer = 0;
	}
	int nodeNumber() const {
		return mNodeNumber;
	}
	const NodeTemplate* node( int i ) const {
		return &mNodes[ i ];
	}
	const char* name() const {
		return mName;
	}
	Container::Impl* container(){
		return mContainer;
	}
private:
	int countNode( Xml::ConstElement&, int n );
	int build( Xml::ConstElement&, Container::Impl&, int nodePos, const Matrix3x4* parent = 0, const Matrix3x4* offset = 0 );

	NodeTemplate* mNodes; //0番が根と決まっているので根を指すポインタは不要
	int mNodeNumber;
	const char* mName;
	Container::Impl* mContainer;
};

} //namespace Scene
} //namespace NTEngine

#endif // INCLUDED_NTENGINE_SCENE_TREETEMPLATE_H
